<?php 
/*
        It must be assured that content type it's application/xhtml+xml. See link below 
        http://www.webdevout.net/articles/beware-of-xhtml#content_type
*/
header('Content-type: application/xhtml+xml'); 

/*
        Must be printed here because calling  a function from outside makes the declaration 
        appears after a carriage return. Won't validate that way.
*/
print("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); 

print("<!--
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@8.             o@@@@@@@::..      o@@@@@@@::..      o@@@@@@@@@@@@@@C:.       :c:ccoCCoo@@@@@Oc:::..    @@@@@@@Oc:::..    @@@@@@@@@@O.             c@
@8                  @@@@@@          o@@@@@@@          o@@@@@@@@@@@:             cCCCCCCo@@@@@@o          @@@@@@@o  .       @@@@@@@@O ................ 
O                 .@@@@@@@          o@@@@@@@          o@@@@@@@@8.   .    .o@O:. .:CCCCC@@@@@@@C..........@@@@@@@o..........@@@@@@@O .................@
.            . . .@@@@@@@@..........o@@@@@@@..........o@@@@@@@C..C@@@@@o.o@@...c...oC.o@@@@@@@C..........@@@@@@@C..........@@@@@@@..................@@
 .........C@@@@o.@@@@@@@@@..........o@@@@@@@..........o@@@@@@O.o@@@@@8...:8@@@8........:@@@@@@C..........@@@@@@@C..........@@@@@@@..........C@@@@O.@@@
c..........O@@@@@@@@@@@@@@..........o@@@@@@@..........o@@@@@@:.@@@@@@@8C88..............o@@@@@C..........@@@@@@@C..........@@@@@@@o..........o@@@@@@@@
@c............C@@@@@@@@@@@..........o@@@@@@@..........o@@@@@@..O@@@@@@@@@O..............:@@@@@C..........@@@@@@@C..........@@@@@@@@o............o@@@@@
@@8:.............@@@@@@@@@..........o@@@@@@@..........o@@@@@@...O@@@@@@@C................@@@@@C..........@@@@@@@C..........@@@@@@@@@@c............ 8@@
@@@@@8c........   o@@@@@@@......... o@@@@@@@..........o@@@@@@c....:coc:................ c@@@@@C....:.:...@@@@@@@C:.:::::.. @@@@@@@@@@@@@o:.:::::.   :@
@@@@@@@@O....      O@@@@@@   ...    c@@@@@@8  .....   o@@@@@@@....:.:::::.::.::.::.:.  .@@@@@@o  .:...   8@@@@@@c ..:..    @@@@@@@@@@@@@@@8::.       o
@@@@@@@@C          c@@@@@@           8@@@@@:          o@@@@@@@8            ...        o@@@@@@@C          c@@@@@8           @@@@@@@@@@@@@@@O          .
@.   .             o@@@@@@c            ..             o@@@@@@@@@o                     :@@@@@@@8            .:.             @@@@@@@@.   .             :
@.                 @@@@@@@8                           o@@@@@@@@@@@C                     8@@@@@@:                           @@@@@@@@.                 8
@.               .@@@@@@@@@O                          o@@@@@@@@@@@@o  cOO8Oo.            @@@@@@@.                          @@@@@@@@.                8@
@.             .8@@@@@@@@@@@@c             OO         o@@@@@@@@@@@@@@@@@@@@@@@c          o@@@@@@@O             :@:         @@@@@@@@.             .8@@@
@8Oo:.   .:oO@@@@@@@@@@@@@@@@@@@8occcoo8@@@@@OO88@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.         :@@@@@@@@@@8Cc:.:co8@@@@CCCOO8@@@@@@@@@@@@@Oo:..  .:oO@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:         :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8          o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O  c@@@@@@@@c           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o                       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:                      .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.                     .8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o                  o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-->");

/*
        Server-side logic files
*/
//clude_once("index.php");       //Bussines model and form parsing code, this file
include_once("lib/content.php"); //Library for content generation
include_once("lib/data.php");    //Library for data management
include_once("lib/test.php");    //Library for server-side validation and refactoring 
//clude_once("lib/style.php");   //Support library for content generation

/*
        Global variables
*/

global $error;
$error = array();

/////////////////////////////
//// Form logic and content logic block
////////////////////////////
{

    ///////////////////////////////////
    $user      = NULL;
    $page      = NULL;
    $subpage   = NULL;
    $action    = NULL;
    $opt       = NULL;
    $opt_entry = NULL;
    ///////////////////////////////////

    if(isset($_GET['page']))
        $page = strtolower($_GET['page']);

    session_start();
    
    if(isset($_SESSION['email']) and isset($_SESSION['user_hash'])){
        $user_email = $_SESSION['email'];
        $user_hash = $_SESSION['user_hash'];
        try{
            $user = new User($user_email, $user_hash);
        }catch(Exception $e){
                $error['unexpected'] = $e->getMessage();
        }
    }

    if(isset($_GET['action'])){
        $action = strtolower($_GET['action']);
    
        switch($action){
        case 'login':
            if(isset($_POST['email']) and isset($_POST['user_hash'])){

                    $user_email = $_POST['email'];
	            $user_hash = $_POST['user_hash'];
                    //TODO: validate user and password
                    $_SESSION['email'] = $user_email;
                    $_SESSION['user_hash'] = $user_hash;

                    try{
                         $user = new User($user_email, $user_hash);
                    }
                    catch(Exception $e){
                        error_log('[nor] Error al hacer login: ' . $e->getMessage());
                        $error['login'] = $e->getMessage();
                    }
            }
            break;

        case 'logout':
            session_destroy();
            $user = NULL;
            break;
        default:
        }       
    }
    
    switch($page){
	case 'register':
        $message = null;
	    if(isset($_POST['email']) and isset($_POST['user_hash']) and $action==='registered'){

                $email = $_POST['email'];
                $hash  = $_POST['user_hash'];
                $valid_user = true;

                $valid_user = Validate::email($email);
                if(!$valid_user)
                       error_log('[nor] Hubo un intento de registro con correo no validado desde ' . 'desconocido');
                $valid_user = $valid_user and Validate::sha256($hash);
                if(!$valid_user)
                       error_log('[nor] Hubo un intento de registro con hash no estandar desde ' . 'desconocido');
                if($valid_user){
                        try{
                                User::add_user($_POST['email'], $_POST['user_hash']);
                                $_SESSION['email']      = $_POST['email'];
                                $_SESSION['user_hash']  = $_POST['user_hash'];
                        }catch(Exception $e){
                                error_log('[nor] Error al registrar usuario: ' . $e->getMessage());
                                $error['register'] = 'Error al registrar al usuario, posiblemente exista ya uno con el mismo nombre';
                        }
                }else{
                      $error['register'] = 'Error inesperado al registrar usuario, consulte al administrador';
                }
	    }

            Pages::register($action);
	    break;
    case 'config':
        if(isset($_GET['config_pg']))
            $subpage = strtolower($_GET['config_pg']);
        
        // Entry opt
        if (isset($_GET['del'])){
            $opt_entry = $_GET['del'];
            $opt_entry = new Entry($opt_entry);
            $opt = 2;
        }
        if (isset($_GET['edit'])){
            $opt_entry = $_GET['edit'];
            $opt_entry = new Entry($opt_entry);
            $opt = 1;
        }
        if (isset($_GET['entry'])){
            $opt_entry = $_GET['entry'];
            $opt_entry = new Entry($opt_entry);
            $opt = 0;
        }
        if(isset($_GET['action'])){
            $action = strtolower($_GET['action']);
            switch($action){
                case 'change_email':
                   if(isset($_POST['email']) and isset($_POST['re_user_hash'])){
                        $new_email = $_POST['email'];
                        $check_hash = $_POST['re_user_hash'];
                        $valid_mail = true;
                        $valid_mail = Validate::mail($new_email);

                        if(!$valid_mail)
                           error_log('[nor] Hubo un intento de cambio de correo no validado desde ' . $_SERVER['HTTP_CLIENT_IP']);

                        if($user!==NULL and $user->hash===$check_hash and $valid_mail){
                                try{
                                       $user->change_email($new_email); 
                                       $_SESSION['email'] = $new_email;
                                } catch(Exception $e){
                                        error_log('[nor] Error al cambiar el correo: ' . $e->getMessage());
                                        $error['change_mail'] = 'No se pudo cambiar el email';
                                }
                                error_log("[nor] Error al cambiar el correo, user_id=" . $user->user_id);
                        }else{
                                if($user!==NULL)
                                        $error['change_mail'] = 'Contraseña incorrecta';
                                else
                                        $error['change_mail'] = 'Error inesperado, consulte al administrador';
                                error_log('[nor] Error al cambiar el correo, ' . $error['change_email']);
                        }
                   }
                  
                break;
                case 'change_pass':
                       if(isset($_POST['re_user_hash']) and isset($_POST['new_user_hash'])){
                         $new_hash = $_POST['new_user_hash'];
                         $check_hash = $_POST['re_user_hash'];
                         $valid_hash = true;

                         $valid_hash = Validate::sha256($new_hash);
                         if(!$valid_hash)
                                error_log('[nor] Hubo un intento de cambio de  hash no estandar desde '  . $_SERVER['HTTP_CLIENT_IP']);

                         if($user!==NULL and $user->hash===$check_hash and $valid_hash){
                                try{
                                   $user->change_pass($new_hash); 
                                   $_SESSION['user_hash'] = $new_hash;
                                }catch(Exception $e){
                                        error_log('[nor] Error al cambiar la contraseña: '. $e->getMessage()); 
                                        $error['change_pass'] = 'No se pudo cambiar la contraseña, error inesperado';
                                }
                         }else{
                                if($user!==NULL)
                                        $error['change_pass'] = 'Contraseña incorrecta';        
                               else
                                        $error['change_pass'] = 'Error inesperado, consulte al administrador';
                                error_log('[nor] Error al cambiar la contraseña, ' . $error['change_email']);
                         }
                       }
                break;
                case 'change_sharing':
                    $bool = isset($_POST['sharing_opt']);
                    if ($bool)    
                        $user->change_sharing(1);
                    else
                        $user->change_sharing(0);
                    break;
                case 'change_feed':
                    $publishers = Publisher::get_publishers();
                    foreach ($publishers as $pub){
                        $id_pub = $pub->publisher_id;
                        $act = isset($_POST["pub_".$id_pub]);
                        try{
                                if ($act and !$user->is_subscripter_to($pub)){
                                    $user->change_subscription($pub, true);
                                }
                                elseif(!$act and $user->is_subscripter_to($pub)){
                                    $user->change_subscription($pub, false);
                                }
                        }catch(Exception $e){
                                error_log("[nor] Error al cambiar la subscripción" . $e->getMessage());
                                $error['change_feed'] = 'Error inesperado al cambiar la subscripción, consulte al administrador';
                        }
                    }
                    break;
                case 'add_user':
	                if(isset($_POST['new_email']) and isset($_POST['new_user_hash'])){
                        $email = $_POST['new_email'];
                        $hash  = $_POST['new_user_hash'];
                        $valid_user = true;
                        
                        $valid_user = Validate::email($email);
                        error_log('aaa ' . $valid_user?'true':'false');
                        if(!$valid_user)
                              error_log('[nor] Hubo un intento de registro a través de admin con correo no validado desde ' . 'desconocido' . ",new_email=$email");
                        
                        $valid_user = $valid_user and Validate::sha256($hash);
                        error_log('bbb ' . $valid_user?'true':'false');
                        if(!$valid_user)
                               error_log('[nor] Hubo un intento de registro a través de admin con hash no estandar desde ' .   'desconocido' .  ",new_user_hash=$hash");

                        if($valid_user){
                                try{
                                        
                                   User::add_user($_POST['new_email'], $_POST['new_user_hash']);
                                }catch(Exception $e){
                                   error_log('[nor] Error al añadir usuario desde el panel de administrador: ' . $message  = $e->getMessage());
                                   $error['add_user'] = 'Error al añadir el usuario, consulte al administrador';
                                }
                        }else{
                           $error['register'] = 'Error inesperado al registrar usuario, consulte al administrador del sistema';
                        }
	            }
                    break;
                case 'del_user':
                    if (isset($_POST['user_del'])){
                        $user_del = $_POST['user_del'];
                        try{
                                $user->del_user($user_del, $user->hash);
                        }catch(Exception $e){
	    	           error_log('[nor] Error al borrar al usuario: ' . $message  = $e->getMessage());
                           $error['del_user'] = 'Error al borrar al usuario, consulte al administrador';
                        }
                    }
                    break;
                case 'change_per':
                    if ($_POST['add_quit'] == 'Dar')
                        $add = true;
                    else
                        $add = false;
                    if(isset($_POST['user_per']) and isset($_POST['pub_per'])){
                            try{
                                    $user_per = $_POST['user_per'];
                                    $user_per = $user->get_user_by_email($user_per);
                                    $pub_per = $_POST['pub_per'];
                                    $pub_per = Publisher::get_publisher_by_name($pub_per);
                                    $user->change_permission_write($user_per, $pub_per, $add);
                            }catch(Exception $e){
                                   error_log('[nor] Error al cambiar permisos de usuario: ' . $message  = $e->getMessage());
                                   $error['change_per'] = 'Error al cambiar permisos de usuario, consulte al administrador';
                            }
                    }else{
                           error_log('[nor] Error al cambiar permisos de usuario, las variables no están definidas en POST');
                           $error['change_per'] = 'Error al cambiar permisos de usuario, consulte al administrador';
                    }
                    break;
                case 'add_entry':
                    if(isset($_POST['pub_entry'])   and
                       isset($_POST['title_entry']) and
                       isset($_POST['text_entry']) ){
                        try{
                             // TODO ? Comprobar que pub_entry_id no este vacio y exista
                             $date_e = strftime( "%Y-%m-%d-%H-%M-%S", time());
                             $pub_entry_id   = Refactor::escapeXMLEntities($_POST['pub_entry']); 
                             $title_entry    = Refactor::escapeXMLEntities($_POST['title_entry']);  
                             $text_entry     = Refactor::adaptHTML($_POST['text_entry']); 
                             $pub_entry      = Publisher::get_publisher_by_name($pub_entry_id);
                             $user->write_entry($pub_entry, $title_entry, $text_entry, $date_e);
                        } catch(Exception $e){
                            error_log("[nor] Error al añadir una nueva entrada, " . $e->getMessage());
                            $error['change_per'] = 'Error al añadir una nueva entrada, consulte al administrador';
                        }
                    }else{
                        error_log('[nor] Error al añadir una nueva entrada, las variables no están definidas en POST');
                        $error['change_per'] = 'Error al añadir una nueva entrada, consulte al administrador';
                    }
                    break;
                case 'update_entry':
                    if(isset($_POST['title_entry_u']) and
                       isset($_POST['text_entry_u'])) {
                        try{
                             $entry = $opt_entry;
                             $title_entry  = Refactor::escapeXMLEntities($_POST['title_entry_u']);  
                             $text_entry   = Refactor::adaptHTML($_POST['text_entry_u']); 
                             $entry->title_e = $title_entry;
                             $entry->content_e = $text_entry;
                             $entry->date = strftime( "%Y-%m-%d-%H-%M-%S", time());
                             $user->update_entry($entry);
                        } catch(Exception $e){
                            error_log("[nor] Error al modificar la entrada, " . $e->getMessage());
                            $error['change_per'] = 'Error al modificar la entrada, consulte al administrador';
                        }
                    }else{
                        error_log('[nor] Error al modificar la entrada, las variables no están definidas en POST');
                        $error['change_per'] = 'Error al modificar la entrada, consulte al administrador';
                    }
                    break;
                case 'del_entry':
                    if(isset($_POST['del_entry_yes'])){
                        try{
                            $opt_entry->del_entry($user);
                        }
                        catch(Exception $e){
                            error_log("[nor] Error al eliminar entrada: " . $e->getMessage());
                        }
                    }
                    break;
                case 'add_publisher':
                    if(isset($_POST['title_pub']) and
                       isset($_POST['dir_rss'])   and
                       isset($_POST['url'])       and
                       isset($_POST['descrip_pub']))
                       try{
                            $name_pub       = $_POST['title_pub'];  
                            $dir_rss_pub    = $_POST['dir_rss']; 
                            $dir_url_pub    = $_POST['url']; 
                            $descrip_pub    = $_POST['descrip_pub']; 
                            Publisher::add_publisher($name_pub, $dir_rss_pub, $dir_url_pub, $descrip_pub);
                       }catch(Exception $e){
                           error_log('[nor] Error al añadir una nuevo publicador:' . $e->getMessage());
                           $error['add_publisher'] = 'Error al añadir una nuevo publicador, consulte al administrador';
                       }else{
                           error_log('[nor] Error al añadir una nuevo publicador, las variables no están definidas en POST');
                           $error['add_publisher'] = 'Error al añadir una nuevo publicador, consulte al administrador';
                       }
                    break;
                case 'del_publisher':
                    if(isset($_POST['del_pub'])){
                        $name_pub  = $_POST['del_pub'];  
                        try{
                                $del_pub = Publisher::get_publisher_by_name($name_pub);
                                Publisher::del_publisher($del_pub);
                        }catch(Exception $e){
                           error_log('[nor] Error al eliminar un publicador:' . $e->getMessage());
                           $error['add_publisher'] = 'Error al eliminar un publicador, consulte al administrador';
                       }
                    }else{
                           error_log('[nor] Error al eliminar un publicador, las variables no están definidas en POST');
                           $error['add_publisher'] = 'Error al eliminar un publicador, consulte al administrador';
                   }
                default:
                    break;
            }
        }
        Pages::config($user, $subpage, $entry=array($opt, $opt_entry));
        break;
    case 'about':
        Pages::about($user);
        break;
    default:
        if (isset($_GET['feed'])){
            $id_feed = $_GET['feed'];
            try{
                    $pub = new Publisher($id_feed);
            }catch(Exception $e){
                error_log("[nor] Error al seleccionar feed a mostrar: " . $e->getMessage());
            }
        }
        else{
            $pub = null;
        }
        if (isset($_GET['nav'])){
            $current_num = $_GET['nav'];
        }
        else{
            $current_num = 0;
        }
        
        Pages::index($user, $pub, $current_num, $entry=array($opt, $opt_entry));
    }
}

?>

